package com.study.d4_thread;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
    private String cardId;
    private double money;
    public Account(String cardId,double money){
        this.cardId=cardId;
        this.money=money;
    }
    //方法三
    private Lock lk = new ReentrantLock();
    //方法二、可以使用同步方法：对出问题的核心方法用synchronized修饰，放在返回类型面前
        //原理：实例方法默认使用this作为锁对象
            //静态方法默认使用类名.class作为锁对象


    public  void drawMoney(double money) {
        String name = Thread.currentThread().getName();
        //方法一、使用同步代码块解决线程安全问题：对于出问题核心代码用synchronized加锁，每次只能一个线程占锁进入访问
        // 锁对象使用规范
        //建议使用共享资源作为锁对象，对于实例方法建议使用this作为锁对象
        //对于静态方法建议使用字节码（类.class）对象作为锁对象
//        synchronized (this)
//        {

        lk.lock();
        if (this.money >= money) {
            System.out.println(name + "取钱成功，取出:" + money);
            this.money -= money;
            System.out.println(name + "取钱成功后，余额：" + this.money);
        } else {
            System.out.println(name + "取钱失败，余额不足！");
        }
        lk.unlock();
//        }
    }
}
